package cn.green.config.interfaces;

import cn.green.config.exceptions.QTableConfigException;
import cn.green.core.components.ddao.QDcl;
import cn.green.core.components.ddao.QDdl;
import cn.green.core.components.ddao.QDml;
import cn.green.core.components.ddao.QDql;
import cn.green.core.components.lock.TableLock;
import cn.green.core.excel.QExcel;
import cn.green.core.excel.QExcelLogger;
import cn.green.core.excel.impls.QExcelImpl;
import cn.green.core.front.QFront;
import cn.green.manage.cache.QCache;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * QTable的配置接口，需要自定义实现
 */
public interface QTableConfiguration {
    /**
     * 获取数据库定义sql执行器
     * @return 数据库定义
     */
    default QDdl getQDdl() {
        throw new QTableConfigException("QDdl not implemented");
    }
    /**
     * 获取数据库控制sql执行器
     * @return 数据库定义
     */
    default QDcl getQDcl() {
        throw new QTableConfigException("QDcl not implemented");
    }
    /**
     * 获取数据库管理sql执行器
     * @return 数据库定义
     */
    default QDml getQDml() {
        throw new QTableConfigException("QDml not implemented");
    }
    /**
     * 获取数据库查询sql执行器
     * @return 数据库定义
     */
    default QDql getQDql() {
        throw new QTableConfigException("QDql not implemented");
    }

    /**
     * 获取QTable的缓存组件
     * @return 缓存组件
     */
    default QCache getQCache() {
        throw new QTableConfigException("QCache not implemented");
    }

    /**
     * 获取QTable的前端组件
     * @return 前端组件
     */
    default QFront getQFront() {
        throw new QTableConfigException("QFront not implemented");
    }

    /**
     * 配置QTable的excel组件
     * @return excel组件
     */
    default QExcel getQExcel() {
        return new QExcelImpl();
    }

    /**
     * 配置QTable的excel日志组件
     * @return excel日志组件
     */
    default QExcelLogger qExcelLogger() {
        System.err.println("QTable: The Component [QExcelLogger] is not exists, QExcel functions will be limited.");
        return new QExcelLogger() {

            @Override
            public JSONObject logPage(String source, String scheme, String tableName, Integer pageNo, Integer pageSize) {
                return null;
            }

            @Override
            public JSONArray logList(String source, String scheme, String tableName) {
                return null;
            }

            @Override
            public int insertSuccessLog(String source, String scheme, String tableName) {
                return 0;
            }

            @Override
            public int insertErrorLog(String source, String scheme, String tableName, Workbook workbook) {
                return 0;
            }
        };
    }

    /**
     * 配置QTable的表锁
     * @return 表锁
     */
    default TableLock tableLock() {
        System.err.println("QTable: The Component [TableLock] is not exists, TableLock functions will be limited.");
        return new TableLock() {

            @Override
            public void lock(String sourceName, String schemeName, String tableName) {

            }

            @Override
            public boolean tryLock(String sourceName, String schemeName, String tableName) {
                return false;
            }

            @Override
            public void unlock(String sourceName, String schemeName, String tableName) {

            }
        };
    }
}
